
package priv.sort.merge;

// 归并排序
public class MergeSort {
    public static void sort(int[] arr) {
        if (arr == null || arr.length < 2) {
            return;
        }
        mergeSort(arr, 0, arr.length - 1);
    }

    private static void mergeSort(int[] arr, int left, int right) {
        // 只有一个元素，不需要排序
        if (left == right) {
            return;
        }
        int mid = left + (right - left) / 2;
        mergeSort(arr, left, mid); // 左递归排序
        mergeSort(arr, mid + 1, right); // 右递归排序
        merge(arr, left, mid, right); // 合并
    }

    private static void merge(int[] arr, int left, int mid, int right) {
        // 临时数组
        int[] temp = new int[right - left + 1];
        int i = left, j = mid + 1, k = 0;

        // 比较两个子数组中的元素
        while (i <= mid && j <= right) {
            if (arr[i] <= arr[j]) {
                temp[k++] = arr[i++];
            } else {
                temp[k++] = arr[j++];
            }
        }

        // 如果左子数组还有剩余元素，全部放入临时数组
        while (i <= mid) {
            temp[k++] = arr[i++];
        }

        // 如果右子数组还有剩余元素，全部放入临时数组
        while (j <= right) {
            temp[k++] = arr[j++];
        }

        System.arraycopy(temp, 0, arr, left, temp.length);
    }
}